package day11;

import java.util.concurrent.TimeUnit;

/**
 * 线程阻塞状态中如何中断,见下方代码
 * 补充：
 * 调用线程的interrupt()实例方法，线程的中断标志会被置为true
 * 当线程处于阻塞状态时，调用线程的interrupt()实例方法，线程内部会触发InterruptedException异常，
 * 并且会清除线程内部的中断标志（即将中断标志置为false）
 */
public class Demo3 {
    public static class T extends Thread {
        @Override
        public void run() {
            while (true) {
                //循环处理业务
                //下面模拟阻塞代码
                try {
                    TimeUnit.SECONDS.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    this.interrupt();
                }
                if (this.isInterrupted()) {
                    break;
                }
            }
        }
    }

    /**
     * main方法中调用了t.interrupt()方法，此时线程t内部的中断标志会置为true
     * 然后会触发run()方法内部的InterruptedException异常，所以运行结果中有异常输出，上面说了，当触发InterruptedException异常时候，线程内部的中断标志又会被清除（变为false），所以在catch中又调用了this.interrupt();一次，将中断标志置为false
     * run()方法中通过this.isInterrupted()来获取线程的中断标志，退出循环（break）
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        T t = new T();
        t.start();
        TimeUnit.SECONDS.sleep(3);
        t.interrupt();
    }
}
